﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using TPTecnicas.MessageProcessor.Common;
using TPTecnicas.MessageProcessor.Business;
using System.ComponentModel.Composition;


namespace TPTecnicas.MessageProcessor.Rules
{
    [Export(typeof(IRule))]
    [ExportMetadata("Name", "AltaGrupo")]
    public class AltaGrupo : Rule
    {

        [ImportingConstructor]
        public AltaGrupo([Import("context")]IUniversityContext context)
            : base(context)
        {

        }

        public override void ApplyTo(IMessage message)
        {
            var match = GetMatch(message);
            if (match.Success)
            {
                if (!Context.StudentRepository.Registrado(message.Sender))
                    throw new ApplicationException("Debe darse de alta primero.");

                var padronesFile = message
                    .Attachments
                    .FirstOrDefault(a => a.Contains("padrones.txt"));

                if (padronesFile == null)
                    throw new ApplicationException("No se encontro el archivo con padrones.");

                var padrones = new List<string>(); //TODO levantar archivo.

                if (padrones.Any(p => !Context.StudentRepository.Registrado(p)))
                    throw new ApplicationException("No todos los usuarios estan registrados en el cuatrimestre actual.");

                if (padrones.Any(p => Context.StudentRepository.TieneGrupo(p)))
                    throw new ApplicationException("No todos los usuarios estan sin grupo en el cuatrimestre actual.");

                Notify(message);

            }

            if (message.Subject.Contains("ALTA-GRUPO"))
            {
                //TODO
                //Sería útil, tener alguna estadistica de cuantos mails son recibidos y no matchean a una regla 
                //por lo que son rebotados, como para mejorar la regla o la explicación de la misma
            }
        }

        protected override Match GetMatch(IMessage message)
        {
            var regex = new Regex(@"^\[ALTA-GRUPO\]$");
            return regex.Match(message.Subject);
        }
    }
}